/**
 * Description:
 * Date: 2025-11-02
 * Time: 14:56
 */

//需要一个类，该类能放任意类型的数据
class MyArray1 {
    Object[] objects = new Object[10];

    public void setObjects (int pos, Object val) {
        objects[pos] = val;
    }

    public Object getObjects (int pos) {
        return objects[pos];
    }
}

//<E>可以理解为占位符：表示该类是泛型类,接收传入的类类型
//传入什么类，说明该对象就对应什么类
//泛型类优点：①数据类型参数化 ②：编译时自动进行类型检查和转换

//class MyArray<E extends Number> { //泛型边界：只接受Number的子类作为泛型类型参数
//class MyArray<E extends Comparable<E>> { //传入的参数必须实现了Comparable
class MyArray<E> {
    Object[] objects = new Object[10];

    public void setObjects (int pos, E val) {
        objects[pos] = val;
    }

    //JVM中没有泛型的概念，在编译的过程中，编译器会将所有的E擦除成Object
    //但是在擦除之前，就已经完成了自动类型检查和转换的操作
    public E getObjects (int pos) {
        return (E)objects[pos];//在取数据时在方法中就进行强转，不需要在外面进行强转
    }
}

public class demo {
    public static void main1(String[] args) {
        MyArray1 myArray1 = new MyArray1();
        myArray1.setObjects(0,10);
        myArray1.setObjects(1,"string");

        String str = (String)myArray1.getObjects(1);
        System.out.println(str);

        //可以放任意类型的数据，也能获取出来
        /*
        * 存在问题：
        * 1.存放的数据太乱了，什么都能放，不好使用
        * 2.每次取数据时，类型都需要进行强转
        * */
    }



    public static void main(String[] args) {
        //传入Integer类型，表明当前类只能操作整型相关的数据
        MyArray<Integer> myArray = new MyArray<>();
        myArray.setObjects(0,10);
        myArray.setObjects(1,20);//自动类型检查
//        myArray.setObjects(2,"30");//当前类时整型相关的类，编译器会自动检查传入的数据
        Integer a = myArray.getObjects(0);//取数据前就已经进行了强转
        Integer b = myArray.getObjects(1);//自动类型转换
        System.out.println(a);
        System.out.println(b);
        System.out.println("=====================");

        MyArray<String> myArray1 = new MyArray<>();
        myArray1.setObjects(0,"str1");
        myArray1.setObjects(1,"str2");
        String str1 = myArray1.getObjects(0);
        String str2 = myArray1.getObjects(1);
        System.out.println(str1);
        System.out.println(str2);

        System.out.println(myArray);//MyArray@3b07d329
        System.out.println(myArray1);//MyArray@41629346
        //可以看出，<E>中的类型参数并没有参与到MyArray类型地址，也证明了在字节码文件中是没有泛型的说法



    }

}
